package co.com.coomeva.adminEvaluacion.managedBean;

import java.util.Iterator;
import java.util.List;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import co.com.coomeva.adminEvaluacion.delegado.DelegadoEdPEstado;
import co.com.coomeva.adminEvaluacion.delegado.DelegadoEdPPeriodoEvaluacion;
import co.com.coomeva.adminEvaluacion.delegado.DelegadoEdPUnidadNegocio;
import co.com.coomeva.adminEvaluacion.delegado.DelegadoUsuario;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPPeriodoEvaluacion;
import co.com.coomeva.adminEvaluacion.modelo.entidades.consulta.Consulta;
import co.com.coomeva.adminEvaluacion.util.FacesUtils;

public class SelectorBean {
	private MensajeBean mensaje = null;
	
	private Long consUnidadNegocio;
	
	private SelectItem[] empresasItems;
	private List<Consulta> lEmpresas = null;
	
	private DelegadoUsuario delegadoUsuario;
	private DelegadoEdPPeriodoEvaluacion delegadoPeriodo;
	private DelegadoEdPUnidadNegocio delegadoUnidad;
	
	private String usuarioRedSesion;
	
	public SelectorBean() {
		/**************SIMULADO**************/
		//FacesUtils.getSession().setAttribute("gerencia_codigo", "1");
		//FacesUtils.getSession().setAttribute("usuario_red", "criminalmind");
		//FacesUtils.getSession().setAttribute("usuario", new Object());
		/************************************/
		
		delegadoUsuario = DelegadoUsuario.getInstance();
		delegadoPeriodo = DelegadoEdPPeriodoEvaluacion.getInstance();
		delegadoUnidad = DelegadoEdPUnidadNegocio.getInstance();
		mensaje = (MensajeBean) FacesUtils.getManagedBean("mensajeBean");
		
		if (FacesUtils.getSession().getAttribute("usuario") == null ||
				FacesUtils.getSession().getAttribute("usuario_red") == null) {
			System.out.println("DEBE INICIAR SESION!!!");
			//No ha iniciado sesion!!
			FacesContext facesContext = FacesContext.getCurrentInstance();
			NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
			navigationHandler.handleNavigation(facesContext, null, "irIngresar");
		} else {
			//La sesion esta iniciada...
			usuarioRedSesion = (String) FacesUtils.getSession().getAttribute("usuario_red");
			
			redireccionar();
		}
	}
	
	private void redireccionar() {
		try {
			lEmpresas = delegadoUsuario.consultarUnidadesUsuario(usuarioRedSesion);
			
			//System.err.println("NUM_EMPRESAS: " + lEmpresas.size());
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		if (lEmpresas != null && lEmpresas.size() == 1) {
			//Solo tiene una empresa o unidad de negocio...
			for (Iterator<Consulta> iter = lEmpresas.iterator(); iter.hasNext();) {
			Consulta objEmpresa = (Consulta) iter.next();
				if (objEmpresa != null){
					consUnidadNegocio = objEmpresa.getConsUnidadNegocio();
					break;
				}
			}
			
			FacesContext facesContext = FacesContext.getCurrentInstance();
			NavigationHandler navigationHandler = facesContext.getApplication().getNavigationHandler();
			navigationHandler.handleNavigation(facesContext, null, continuar());
		}
	}
	
	public String continuar() {
		String strIr = "irInicio";
		
		try {
			validador();
			//delegadoUsuario
			
			Long[] consecutivos = delegadoUsuario.obtenerEmpresaYUnidad(consUnidadNegocio);
			
			//Nombre de la unidad y/o empresa
			String strNombreUnidad = delegadoUnidad.obtenerNombre(consUnidadNegocio);
			
			FacesUtils.getSession().setAttribute("gerencia_codigo", String.valueOf(consecutivos[0]));
			FacesUtils.getSession().setAttribute("unidad_negocio_codigo", consecutivos[1]);
			FacesUtils.getSession().setAttribute("emp_depto_codigo", consecutivos[2]);
			FacesUtils.getSession().setAttribute("nombre_empresa_unidad", strNombreUnidad);
			
			Long consPeriodo = null;
			String strNombrePeriodo = null;
			try {
				List<EdPPeriodoEvaluacion> lPeridosEmpresa = delegadoPeriodo.empresaPeriodosActivos(consecutivos[0], consecutivos[1]);
				EdPPeriodoEvaluacion periodo = lPeridosEmpresa.get(0);
				consPeriodo = periodo.getConsPeriodo();
				strNombrePeriodo = periodo.getDescripcion();
				
				FacesUtils.getSession().setAttribute("cons_periodo_activo", consPeriodo);
				FacesUtils.getSession().setAttribute("nombre_periodo_activo", strNombrePeriodo);
			} catch (Exception e) {
				//e.printStackTrace();
			}
			
		} catch (Exception e) {
			strIr = "";
			e.printStackTrace();
			mensaje.mostrarMensaje(e.getMessage());
		} finally {
			//
		}
		
		return strIr;
	}
	
	public void limpiar(ActionEvent event){
		consUnidadNegocio = null;
	}
	
	private void validador() {
		if (consUnidadNegocio != null && consUnidadNegocio.longValue() < 0) {
			consUnidadNegocio = null;
		}
	}
	
	private SelectItem[] listadoEmpresas(String usuarioRed) {
		try {	
			lEmpresas = delegadoUsuario.consultarUnidadesUsuario(usuarioRed);
			
			if (lEmpresas != null && lEmpresas.size() > 0){
				empresasItems = new SelectItem[lEmpresas.size()+1];
				SelectItem listaItem = new SelectItem();
				listaItem.setLabel("");
				listaItem.setValue(new Integer(-1));
				empresasItems[0]= listaItem;
				int i = 0;
				// Arma el combo con los valores
				for (Iterator<Consulta> iter = lEmpresas.iterator(); iter.hasNext();) {
					Consulta objEmpresa = (Consulta) iter.next();
						if (objEmpresa !=null){
							listaItem = new SelectItem();
							listaItem.setValue(objEmpresa.getConsUnidadNegocio());
							listaItem.setLabel(objEmpresa.getEmpresaNombre());
							empresasItems[i+1] = listaItem;
							i++;
						}
					}
				}
		}catch (Exception e) {
			empresasItems = null;
		}finally{
			lEmpresas = null;
		}
		return empresasItems;
	}
	
	public Long getConsUnidadNegocio() {
		return consUnidadNegocio;
	}
	
	public void setConsUnidadNegocio(Long consUnidadNegocio) {
		this.consUnidadNegocio = consUnidadNegocio;
	}
	
	public SelectItem[] getEmpresasItems() {
		return listadoEmpresas(usuarioRedSesion);
	}
	
	public void setEmpresasItems(SelectItem[] empresasItems) {
		this.empresasItems = empresasItems;
	}
}
